package com.zego.wawaji.base.module;

import android.content.Context;
import android.os.Process;

import com.tencent.smtt.sdk.QbSdk;
import com.umeng.analytics.MobclickAgent;
import com.zego.wawaji.base.log.PLogger;
import com.zego.wawaji.base.log.PSP;
import com.zego.wawaji.base.log.PToast;
import com.zego.wawaji.base.media.MediaMgr;
import com.zego.wawaji.base.observer.ModuleBase;
import com.zego.wawaji.base.utils.NetworkUtils;
import com.zego.wawaji.http.HttpMgr;
import com.zego.wawaji.http.HttpMgrImpl;
import com.zego.wawaji.http.request.RequestHelper;
import com.zego.wawaji.third.ThirdConstant;
import com.zego.wawaji.third.auth.AuthMgr;
import com.zego.wawaji.third.image.ImageLoader;
import com.zego.wawaji.third.push.PushMgr;
import com.zego.wawaji.ui.center.CenterMgr;
import com.zego.wawaji.ui.start.LoginMgr;
import com.zego.wawaji.ui.wawa.WawaMgr;

import java.util.ArrayList;
import java.util.List;

/**
 * 模块初始化工具
 * Created by ZRP on 2016/12/27.
 */
public final class ModuleMgr {

    private static List<ModuleBase> selfModules = new ArrayList<>();

    /**
     * 调用所有逻辑模块
     */
    public static void releaseAll() {
        for (ModuleBase item : selfModules) {
            try {
                item.release();
            } catch (Throwable e) {
                PLogger.printThrowable(e);
            }
        }
        selfModules.clear();
        selfModules = null;
    }

    /**
     * 按等级初始化逻辑模块
     */
    public static void initModule(final Context context) {
        PSP.getInstance().init(context);//初始化sharedPreferences存储，每个进程都初始化一次
        //初始化日志打印，每个进程都初始化一次
        PLogger.init(false);
//        DirType.init(context, context.getString(R.string.app_storage_name));

        String processName = ModuleMgr.getAppMgr().getProcessName(Process.myPid());
        String packageName = ModuleMgr.getAppMgr().getPackageName();
        PLogger.d("---processName--->" + processName);
        if (processName.equals(packageName)) {//主进程
            preInit(context);

//            int runCount = PSP.getInstance().getInt(FinalKey.APP_RUN_COUNT, 0);
//            PSP.getInstance().put(FinalKey.APP_RUN_COUNT, ++runCount);

        }
    }

    /**
     * 预加载，在进程初始化的时候加载一次
     */
    private static void preInit(Context context) {
        PToast.init(context);                       //初始化toast提示
        RequestHelper.getInstance().init(context);  //初始化网络请求
        ImageLoader.init(context);                  //初始化图片加载
        NetworkUtils.getNetIp();

        initTBSX5(context);
        initUM(context);

        getAppMgr();
        getHttpMgr();
        getMediaMgr();
        getCenterMgr();
        getWawaMgr();
        getPushMgr();
    }

    /**
     * 初始化腾讯X5内核
     *
     * @param context 保证context为applicationContext
     */
    private static void initTBSX5(Context context) {
        //搜集本地tbs内核信息并上报服务器，服务器返回结果决定使用哪个内核。
        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
            @Override
            public void onViewInitFinished(boolean arg0) {
                //x5內核初始化完成的回调，为true表示x5内核加载成功，否则表示x5内核加载失败，会自动切换到系统内核。
                PLogger.d("Tencent tbs x5 is load " + arg0);
            }

            @Override
            public void onCoreInitFinished() {
            }
        };
        //x5内核初始化接口
        QbSdk.initX5Environment(context, cb);
    }

    /**
     * 初始化友盟统计
     */
    private static void initUM(Context context) {
        MobclickAgent.UMAnalyticsConfig config = new MobclickAgent.UMAnalyticsConfig(context,
                ThirdConstant.UMENG_APPKEY, "默认");
        MobclickAgent.startWithConfigure(config);
    }

    /**
     * 将一个新模块添加的管理器中，并调用其init方法
     *
     * @param module 一个新的模块
     */
    private static void addModule(final ModuleBase module) {
        module.init();
        selfModules.add(module);
    }

    /**
     * 应用模块。
     */
    private static AppMgr appMgr = null;

    /**
     * 取得应用信息管理的实例的唯一方法，统一从此处获得，全局唯一
     *
     * @return 返回应用管理器的实例
     */
    public static AppMgr getAppMgr() {
        if (appMgr == null) {
            appMgr = new AppMgrImpl();
            addModule(appMgr);
        }
        return appMgr;
    }

    /**
     * 网络请求模块
     */
    private static HttpMgr httpMgr = null;

    /**
     * 取得应用信息管理的实例的唯一方法，统一从此处获得，全局唯一
     *
     * @return 返回应用管理器的实例
     */
    public static HttpMgr getHttpMgr() {
        if (httpMgr == null) {
            httpMgr = new HttpMgrImpl();
            addModule(httpMgr);
        }
        return httpMgr;
    }

    /**
     * 三方认证
     */
    private static AuthMgr authMgr = null;

    public static AuthMgr getAuthMgr() {
        if (authMgr == null) {
            authMgr = new AuthMgr();
            addModule(authMgr);
        }
        return authMgr;
    }

    /**
     * 文件管理
     */
    private static MediaMgr mediaMgr = null;

    public static MediaMgr getMediaMgr() {
        if (mediaMgr == null) {
            mediaMgr = new MediaMgr();
            addModule(mediaMgr);
        }
        return mediaMgr;
    }

    /**
     * 登录管理
     */
    private static LoginMgr loginMgr = null;

    public static LoginMgr getLoginMgr() {
        if (loginMgr == null) {
            loginMgr = new LoginMgr();
            addModule(loginMgr);
        }
        return loginMgr;
    }

    /**
     * 个人中心管理
     */
    private static CenterMgr centerMgr = null;

    public static CenterMgr getCenterMgr() {
        if (centerMgr == null) {
            centerMgr = new CenterMgr();
            addModule(centerMgr);
        }
        return centerMgr;
    }

    /**
     * 娃娃相关管理
     */
    private static WawaMgr wawaMgr = null;

    public static WawaMgr getWawaMgr() {
        if (wawaMgr == null) {
            wawaMgr = new WawaMgr();
            addModule(wawaMgr);
        }
        return wawaMgr;
    }

    /**
     * 推送管理
     */
    private static PushMgr pushMgr = null;

    public static PushMgr getPushMgr() {
        if (pushMgr == null) {
            pushMgr = new PushMgr();
            addModule(pushMgr);
        }
        return pushMgr;
    }
}
